/*
 * @Author: HeAo
 * @Date: 2022-08-18 18:50:23
 * @LastEditTime: 2022-08-19 10:03:14
 * @LastEditors: HeAo
 * @Description: 
 * @FilePath: \JavaScripe\day-09\03-解决构造函数的弊端.js
 * 别乱动！
 */
/*
原因：在js中，函数是一个对象，因此每次定义函数时，都会初始化一个对象
目的：为了解决自定义构造函数中 方法每次调用都产生不相同的function实例
方法：既然p1和p2都是用的同一个函数，我们直接把它搬出外面就可以了
*/
// 原代码
// function Person(name, age, gender) {
//   this.name = name
//   this.age = age
//   this.gender = gender
//   this.sayName = function () {
//     console.log(this.name);
//   }
// }

// 修改后
function Person(name, age, gender) {
  this.name = name
  this.age = age
  this.gender = gender
  // 通过赋值调用即可sayName函数
  this.sayName = sayName
}
/*
放在全局，全局也会影响作用域，类似Animal构造函数也可以使用sayName()，
但我们本意是 只有Person构造函数才可以调用
*/
function sayName() {
  console.log(this.name);
}
var person1 = new Person("zhangsan", 29, "male");
var person2 = new Person("lisi", 27, "female");
person1.sayName(); // zhangsan 
person2.sayName(); // lisi
console.log(person1.sayName === person2.sayName); //true

/*
弊端:若该对象函数中,有很多个方法,则我们需要一一在外面写出来,
因此全局作用域也被打乱了,也造成自定义类型引用的代码不能很好地聚集一起。
*/